package com.zhanghu.model.factory;

import com.zhanghu.model.computer.AsusComputer;
import com.zhanghu.model.computer.Computer;
import com.zhanghu.model.computer.DellComputer;
import com.zhanghu.model.computer.HpComputer;

/**
 * @Author: zhanghu
 * @Description: 电脑工厂类,这里我们获取电脑对象有多种方法，而使用静态方法则属于静态工厂模式
 * @Date: Create in 16:01 2020/1/14
 * @modified by:
 */
public class ComputerFactory {

    /**
     * 1.通过传入的类名创建对应的电脑类对象,这里我们可以将它改为静态方法，这样就不需要创建工厂对象，可以直接调用静态方法获取对象
     *
     * @param className 类名
     * @return Computer
     */
    public Computer getComputer(String className) {
        if ("dell".equals(className)) {
            return new DellComputer();
        }
        if ("asus".equals(className)) {
            return new AsusComputer();
        }
        if ("hp".equals(className)) {
            return new HpComputer();
        }
        return null;
    }

    /**
     * 创建静态方法获取对象
     *
     * @param className
     * @return
     */
    public static Computer getStaticComputer(String className) {
        if ("dell".equals(className)) {
            return new DellComputer();
        }
        if ("asus".equals(className)) {
            return new AsusComputer();
        }
        if ("hp".equals(className)) {
            return new HpComputer();
        }
        return null;
    }

    /**
     * 这里我们通过泛型加上反射来创建对象，这里也可以创建静态方法
     *
     * @param clazz 类
     * @param <T>   泛型
     * @return
     */
    public <T> T getComputer(Class<T> clazz) {
        try {
            return clazz.newInstance();
        } catch (InstantiationException | IllegalAccessException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 静态方法
     *
     * @param clazz
     * @param <T>
     * @return
     */
    public static <T> T getStaticComputer(Class<T> clazz) {
        try {
            return clazz.newInstance();
        } catch (InstantiationException | IllegalAccessException e) {
            e.printStackTrace();
        }
        return null;
    }
}
